package com.ccc.demoboot.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ccc.demoboot.common.R;
import com.ccc.demoboot.config.JwtUtils;
import com.ccc.demoboot.pojo.Menu;
import com.ccc.demoboot.pojo.Role;
import com.ccc.demoboot.service.MenuService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import jdk.nashorn.internal.parser.Token;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Collections;
import java.util.List;
import java.util.Map;

/**
 * 3@Author wz
 *
 * @Date 2024/5/16 9:58
 * @PackageName:com.ccc.demoboot.controller
 * @ClassName: MenuController
 */

@RequestMapping("/menu")
@RestController
public class MenuController {

    @Autowired
    MenuService menuService;

    /**
     * 查询菜单
     *
     * @param page
     * @return
     */
    @GetMapping("/select/{page}")
    public R select(@PathVariable("page") int page) {
        PageHelper.startPage(page, 5);//第一个参数表示第几页,第二个参数表示每页的条数
        List<Menu> list = this.menuService.list();
        PageInfo<Menu> menuPageInfo = new PageInfo<>(list);
        return new R().add("pageInfo", menuPageInfo);
    }

    /**
     * 查询所有菜单
     *
     * @return
     */
    @GetMapping("/selectRole")
    public R selectRole() {
        QueryWrapper<Menu> objectQueryWrapper = new QueryWrapper<>();
        objectQueryWrapper.orderBy(true,true,"parentid");

        List<Menu> list = this.menuService.list(objectQueryWrapper);
        System.out.println(list);
        return new R().add("list", list);
    }


    /**
     * 根据id删除
     *
     * @param id
     * @return
     */
    @GetMapping("/del/{id}")
    public R del(@PathVariable("id") int id) {
      /*  QueryWrapper<Menu> menyQueryWrapper = new QueryWrapper<>();
        menyQueryWrapper.eq("id",id);*/
        boolean remove = this.menuService.removeById(id);
        return new R().add("remove", remove);
    }


    /**
     * 获取父级菜单
     *
     * @param menu
     * @return
     */
    @PostMapping("/selectment")
    public R selectMent(@RequestBody Menu menu) {
        QueryWrapper<Menu> menyQueryWrapper = new QueryWrapper<>();
        menyQueryWrapper.eq("parentid", menu.getParentid());
        List<Menu> list = this.menuService.list(menyQueryWrapper);
        return new R().add("list", list);
    }

    /**
     * 根据id查询数据
     *
     * @param menu
     * @return
     */
    @PostMapping("/upselect")
    public R upselect(@RequestBody Menu menu) {
        QueryWrapper<Menu> menyQueryWrapper = new QueryWrapper<>();
        menyQueryWrapper.setEntity(menu);
        Menu one = this.menuService.getOne(menyQueryWrapper);
        return new R().add("one", one);
    }

    /**
     * 修改数据
     *
     * @param menu
     * @return
     */
    @PostMapping("/up")
    public R up(@RequestBody Menu menu) {
        boolean update = this.menuService.updateById(menu);
        return new R().add("update", update);
    }

    /**
     * 添加数据
     *
     * @param menu
     * @return
     */
    @PostMapping("/add")
    public R add(@RequestBody Menu menu) {
        boolean add = this.menuService.save(menu);
        return new R().add("add", add);
    }

    /**
     * 查询添加的菜单
     *
     * @param menu 菜单对象，用于接收前端传来的菜单信息
     * @param page 页码，用于分页查询
     * @return 返回一个封装了查询结果的R对象，其中包含了分页信息
     */
    @PostMapping("/selectTj/{page}")
    public R selectTj(@RequestBody Menu menu ,@PathVariable("page") int page) {
        // 开始分页，设置当前页和每页显示的记录数
        PageHelper.startPage(page, 5);//第一个参数表示第几页,第二个参数表示每页的条数

        // 创建查询包装器，用于构建查询条件
        QueryWrapper<Menu> menuQueryWrapper = new QueryWrapper<>();
        // 设置模糊查询条件，查询标签包含指定字符串的菜单
        menuQueryWrapper.like("label",menu.getLabel());

        // 执行查询，获取符合条件的菜单列表
        List<Menu> list = this.menuService.list(menuQueryWrapper);

        // 将查询结果转换为分页信息对象
        PageInfo<Menu> rolePageInfo = new PageInfo<>(list);

        // 创建并返回一个封装了分页信息的R对象
        return new R().add("rolePageInfo", rolePageInfo);
    }


/**
 * 根据角色id查询所属菜单
 * 该方法接收一个包含token的对象，从中解析出用户信息，进而查询该用户所拥有的菜单权限
 * 主要用于动态加载用户菜单，根据用户角色展示不同的功能选项
 *
 * @param map 包含token信息的请求体，用于身份验证和角色识别
 * @return 返回一个结果对象，包含用户菜单列表和系统用户名
 */
@PostMapping("/selectUserMenu")
public R selectUserMenu(@RequestBody Map<String, Object> map) {
    // 从请求体中提取token
    String token = (String) map.get("token");
    // 使用JWT工具从token中解析出系统用户名
    String sysusername = JwtUtils.getJwtToken(token, "sysusername");
    // 使用JWT工具从token中解析出用户ID
    Integer id = JwtUtils.getJwtToken(token, "id");
    // 打印用户ID，便于调试
    System.out.println(id);
    // 调用菜单服务，根据用户ID查询该用户拥有的菜单权限
    List<Menu> menuList = this.menuService.selectMenuByUser(id);
    // 构建并返回结果对象，包含用户菜单列表和系统用户名
    return new R().add("menuList", menuList).add("sysusername",sysusername);
}

}